/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package energiebedrijf.Classes;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 * Een manager om klanten mee uit de database te halen/wijzigen/toevoegen/verwijderen
 * @author Robert
 * 
 */
public class ManagerKlant {
    private ArrayList<Klant> KlantLijst = new ArrayList<Klant>();

    /**
     * Lege constructor
     */
    public ManagerKlant() {
    }

    /**
     * Zoekt een klant adhv zijn klantnaam
     * @param klantNaam De klantnaam
     * @return De gevonden klant of null
     */
    public Klant findKlant(String klantNaam) {
        for (Klant kl : getKlantLijst()) {
            if (kl.getKlantNaam().equalsIgnoreCase(klantNaam)) {
                return kl;
            }
        }
        return null;
    }
    
    /**
     * Zoekt een klant op adhv zijn id in de database
     * @param KlantId Het id van de klant
     * @return De gevonden klant of null
     */
    public Klant findKlant(int KlantId) {
        for (Klant kl : getKlantLijst()) {
            if (kl.getKlantId() == KlantId) {
                return kl;
            }
        }
        
        return null;
    }

    /**
     * Voegt alle nieuwe klanten toe aan de database en slaat de gewijzigde klanten op
     * @return True als het gelukt is, anders false
     */
    public boolean saveAll() {
        
        //Initialiseer de database connectie
        DatabaseConn objCn = new DatabaseConn();
        Connection con = objCn.GetDatabaseConnection();
        
        // Loop alle klanten af en bewaar wijzigingen en voeg nieuwe klant toe.
        for (Klant kl : getKlantLijst()) {
            try {
                PreparedStatement cmd = null;
                // Is het een nieuwe klant?
                if (kl.getKlantId() == -1) {
                    cmd = con.prepareStatement("INSERT INTO klant (klantnaam, straat, huisnummer, postcode, plaats) VALUES (?, ?, ?, ?, ?)");
                    cmd.setString(1, kl.getKlantNaam());
                    cmd.setString(2, kl.getStraat());
                    cmd.setString(3, kl.getHuisnummer());
                    cmd.setString(4, kl.getPostcode());
                    cmd.setString(5, kl.getPlaats());
                } else if (kl.getIsChanged()) {
                    //Alleen een update als de klant gewijzigd is
                    cmd = con.prepareStatement("UPDATE klant SET klantnaam=?, straat=?, huisnummer=?, postcode=?, plaats=? WHERE klant_id=?;");
                    cmd.setString(1, kl.getKlantNaam());
                    cmd.setString(2, kl.getStraat());
                    cmd.setString(3, kl.getHuisnummer());
                    cmd.setString(4, kl.getPostcode());
                    cmd.setString(5, kl.getPlaats());
                    cmd.setInt(6, kl.getKlantId());
                }
                
                //Alleen uitvoeren als dat nodig is
                if (cmd != null) {
                    cmd.executeUpdate();
                    con.commit();

                    if (kl.getKlantId() == -1) {
                        ResultSet rs = con.createStatement().executeQuery("SELECT MAX(klant_id) FROM klant");
                        kl.setKlantId(rs.getInt(0));
                    }
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
                return false;
            }
        }
        
        try {
            con.commit();
            con.close();
        } catch (SQLException ex) {
            System.out.println("Fout: " + ex.getMessage()); 
        }
        
        //Geef aan dat het gelukt is
        return true;
    }

    /**
     * Deze method haalt alle klanten op uit de database en voeg ze toe aan de 
     * lijst met klanten
     */
    public void GetAll() {
        this.setKlantLijst(new ArrayList<Klant>());
        
        try {
            //Initialiseer de database connectie
            DatabaseConn objCn = new DatabaseConn();
            Connection con = objCn.GetDatabaseConnection();

            Statement cmd = con.createStatement();
            ResultSet rs = cmd.executeQuery("SELECT klant_id, klantnaam, straat, huisnummer, postcode, plaats FROM klant ORDER BY klant_id");

            while (rs.next()) {
                Klant k = new Klant();
                k.setKlantId(rs.getInt(1));
                k.setKlantNaam(rs.getString(2));
                k.setStraat(rs.getString(3));
                k.setHuisnummer(rs.getString(4));
                k.setPostcode(rs.getString(5));
                k.setPlaats(rs.getString(6));
                k.setIsChanged(false);
                this.getKlantLijst().add(k);
                System.out.println("Klant ID: " + k.getKlantId().toString() + " Naam: " + k.getKlantNaam());
            }
            
            con.close();
            objCn = null;
        } catch (SQLException ex) {
            System.out.println("Fout: " + ex.getMessage());

        }
    }
    
    /**
     * Deze method verwijderd de meegegeven lijst van klanten uit de database en 
     * ook uit de lijst met klanten
     * @param VerwijderLijst De lijst met klanten die verwijderd moeten worden
     */
    public void RemoveAll(ArrayList<Klant> VerwijderLijst) {
        
        try {
            //Initialiseer de database connectie
            DatabaseConn objCn = new DatabaseConn();
            Connection con = objCn.GetDatabaseConnection();
            
            for (Klant k : VerwijderLijst) {
                //Verwijder de klant uit de database en uit de lijst van klanten
                PreparedStatement cmd = con.prepareStatement("DELETE FROM klant WHERE klant_id=?");
                cmd.setInt(1, k.getKlantId());
                cmd.executeUpdate();
                con.commit();
                this.getKlantLijst().remove(k);
            }
            
            con.commit();
            con.close();
            objCn = null;
        } catch (SQLException ex) {
            System.out.println("Fout: " + ex.getMessage());
        }
    }

    /**
     * Dit is de lijst met alle klanten die in de database zitten
     * @return Een ArrayList<Klant> met de klanten
     */
    public ArrayList<Klant> getKlantLijst() {
        return KlantLijst;
    }

    /**
     * Hiermee kan de lijst met klanten ingesteld worden
     * @param KlantLijst Een ArrayList<Klant>
     */
    public void setKlantLijst(ArrayList<Klant> KlantLijst) {
        this.KlantLijst = KlantLijst;
    }
}
